package com.ztr.suanfa.md5;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SFMD5File {

    public static void main(String[] args) {
        String filePath = "C:\\Users\\16799\\Pictures\\微信图片_20240308172659.jpg";
        String fileMd5Str = md5ForFile(filePath);
        System.out.println("加密后: " + fileMd5Str);
    }

    /**
     * MD5 算法除了用于对字符内容进行加密，还可以用来对文件进行 MD5 校验。
     * 文件进行 MD5 校验即针对每个文件可以计算出一个 MD5 值来作为该文件的唯一编码，
     * 如果文件在传输过程中发生了修改，那么最终得到文件的 MD5 值会发生变化。
     * 根据上述 MD5 校验方法可以验证文件的有效性，保证文件在传输过程中不会被篡改。
     * @param filePath
     * @return
     */
    public static String md5ForFile(String filePath) {
        MessageDigest md = null;
        byte[] fileBytes = new byte[0];

        try {
            md = MessageDigest.getInstance("MD5");
            fileBytes = Files.readAllBytes(Paths.get(filePath));
        }catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }

        byte[] md5 = md.digest(fileBytes);
        StringBuilder sb = new StringBuilder();
        for (byte b : md5) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }

}
